var fs=require('fs');
var gd=require('gd');

/*****************************************************************************/
function admin_filebrowser_redirect_json(space)
{
	var act=space.action;
	var target=space.fields.target||"browser";
	if (target!="browser") act="/admin_popup-filebrowser/";
	return JSON.stringify({redirect:{url:act+"?"+space.controllers.copy_fields(space,"file_type_id,file_group_id,target")+"1=1"}});
}

/*****************************************************************************/
exports.functions={
	user_get_autoscale_policy: function(space,mode) {
		var x,y;
		function step(role) {
			var opt=space.functions.get_option(space,["autoscale",role,mode]);
			if (!opt) return 1;
			if (opt[0]==-1) return 0;
			if (x==undefined || x==null) {x=opt[0];y=opt[1];return 1;}
			if (opt[0]>x) x=opt[0];
			if (opt[1]>y) y=opt[1];
			return 1;
		}
		if (!step("no_roles")) return {};
		if (space.roles) {
			for (var role in space.roles) if (!step(role)) return {};
		}
		return {x:x,y:y};
	}
};

/*****************************************************************************/

exports.controllers={
/*****************************************************************************/
	admin_filebrowser: function(space) {
		if (!space.uid) return "-";
		if (!space.roles.files) return "-";
		return space.controllers['admin_filebrowser__'+(space.fields.mode||"list")](space);
	},


/*****************************************************************************/
	admin_filebrowser__list: function(space) {
		var target=space.fields.target||"browser";
		if (space.fields.file_id) {
			var file=space.site.sql.execute_and_fetch_one("files/get",{file_id:space.fields.file_id});
			space.fields.file_group_id=file.file_group_id;
		}
		space.can_delete=(target=="browser")?1:0;
		space.can_check_images=(target=="browser")?1:0;
		space['target_is_'+target]=1;
		if (target=="simpletinymce") space['target_is_tinymce']=1;
		if (target=="simpliertinymce") space['target_is_tinymce']=1;
//		space.is_popup=(space.action.match(/^\/admin_popup-/))?1:0;

		function fetch_h(arr,level,parent_id) {
			if (parent_id) {
				var cnt=space.site.sql.execute_and_fetch_one("file_groups/count",{parent_id:parent_id});
				if (cnt.cnt>20) {
					arr.push({toomany:1,level:level});
					return;
				}
			}
			var r=space.site.sql.execute_and_fetch("file_groups/list_h",{parent_id:parent_id});
			r.forEach(function(x) {
				x.level=level;
				arr.push(x);
				fetch_h(arr,level+1,x.id);
			});
		}
		space.file_groups=[];
		fetch_h(space.file_groups,1);
//		space.file_groups=space.site.sql.execute_and_fetch_h("file_groups/list_h");
//		space.files=space.site.sql.execute_and_fetch("files/list_part",{limit:50,offset:50*(space.fields.page||0)});
		space.files=space.site.sql.execute_and_fetch("files/list",{});
		space.files_count=space.site.sql.execute_and_fetch_one("files/cnt_in_group")['cnt'];
		var fg_id=space.fields.file_group_id||0;
		space.current_file_groups=space.site.sql.execute_and_fetch("file_groups/list_h",{parent_id:fg_id});
		space.folders_tree=[];
		space.file_groups.forEach(function(fg) {
			if (fg.id==fg_id) fg.active=1;
			space.folders_tree.push({id:fg.id,name:'...'.repeat(fg.level-1)+fg.name});
		});
		var path=space.functions.file_group_path(space,space.fields.file_group_id);
		var basepath=space.site.paths.html;
		space.files.forEach(function(f) {
			f.href=path+f.id+"."+f.ext;
			f.image=(f.type_id==1)?path+f.id+"-preview2."+f.ext:space.functions.guess_icon(space,f.ext);
		});
		var policy=space.functions.user_get_autoscale_policy(space,"offer");
		space.autoscale=policy;
		
		return space.views.process("widgets/admin_filebrowser/body",space);
	},


/*****************************************************************************/
	admin_filebrowser__file_group_delete: function(space) {
		var fg=space.site.sql.execute_and_fetch_one("file_groups/get");
		space.site.sql.execute("file_groups/delete");
		return JSON.stringify({redirect: {url: "/admin-filebrowser/?file_group_id="+fg.parent_id}});
	},
/*****************************************************************************/
	admin_filebrowser__file_group_save: function(space) {
		if (space.fields.id) {
			space.site.sql.execute("file_groups/update",{file_group_id:space.fields.id});
		} else {
			space.site.sql.execute("file_groups/insert");
		}
		return admin_filebrowser_redirect_json(space);
	},


/*****************************************************************************/
	admin_filebrowser__files_delete: function(space) {
		var path;
		var pfiles;
		var fg_id=0;
		var shall_delete="";
		space.fields.file_ids.split(/,/).forEach(function(file_id) {
			if (file_id=="") return;
			var href={file_id:file_id};
			var file=space.site.sql.execute_and_fetch_one("files/get",href);
			space.site.sql.execute("files/delete",href);
			space.site.sql.submit();
			if (fg_id!=file.file_group_id) {
				fg_id=file.file_group_id;
				path=space.site.paths.html+space.functions.file_group_path(space,fg_id);
				try {
					pfiles=new fs.Directory(path).listFiles();
				} catch(e) {
					throw("Can not open directory "+path+", error="+space.Dumper(e));
				}
			}
			var re=new RegExp("^"+file_id+"(\\.|-preview)");
			pfiles.forEach(function(pfile) {
				if (pfile.match(re)) (new fs.File(path+pfile)).remove();
			});
		});
		return admin_filebrowser_redirect_json(space);
	},


/*****************************************************************************/
	admin_filebrowser__popup_select: function(space) {
		space.file=space.site.sql.execute_and_fetch_one("files/get");
		space.path=space.functions.file_group_path(space,space.file.file_group_id);
		space.sizes=[];
		var previews=space.site.previews||space.system.previews;
		var basepath=space.site.paths.html;
		switch (space.file.ext) {
			case 'png':image_type=gd.Image.PNG;break;
			case 'jpg':image_type=gd.Image.JPEG;break;
			case 'gif':image_type=gd.Image.GIF;break;
			default:
				return space.views.process("widgets/admin_filebrowser/popup_select_notimage",space);
//				throw("Unknown file ext="+space.file.ext);
		}
		var image=new gd.Image(image_type,basepath+space.path+space.file.id+"."+space.file.ext);
		space.width=image.sx();
		space.height=image.sy();
		for (var i=0;i<previews.length;i++) {
			space.sizes.push({id:i,width: previews[i][0],height: previews[i][1]});
		}
		return space.views.process("widgets/admin_filebrowser/popup_select",space);
	},

/*****************************************************************************/
	admin_filebrowser__push_file_group_id: function(space) {
		space.value=space.functions.ajajform_file_group_value(space,space.fields.file_group_id);
		return space.views.process("widgets/admin_filebrowser/push_file_group_id",space);
	},
/*****************************************************************************/
	admin_filebrowser__save_attrs: function(space) {
		var hrefs={};
		for (var p in space.fields) {
			var arr;
			if (!(arr=p.match(/^(\d+)-(\w+)$/))) continue;
			if (!hrefs[arr[1]]) hrefs[arr[1]]={file_id:arr[1]};
			hrefs[arr[1]][arr[2]]=space.fields[p];
		}
		for (var file_id in hrefs) {
			space.site.sql.execute("files/set_attributes",hrefs[file_id]);
		}
		return admin_filebrowser_redirect_json(space);
	},


/*****************************************************************************/
	admin_filebrowser__upload: function(space) {
		if (!space.uid) return "-";
		if (!space.roles.files) return "-";
		if (space.req.get && space.req.get.sid) space.fields=space.req.get;
		var fg_id=space.fields.file_group_id;
		var path=space.functions.file_group_path(space,fg_id);
		var basepath=space.site.paths.html;
		space.functions.mkdir_rec(basepath,path);
		for (var fn in space.req.files) {
			space.functions.user_upload_file(space,{inputname:fn,fg_id:fg_id});
		}
		var target=space.fields.target||"browser";
		if (target!="browser") {
			space.ret=admin_filebrowser_redirect_json(space);
			return space.views.process("widgets/iframe_ret",space);
		}
		return "success";
	},
/*****************************************************************************/
	admin_filebrowser__rotate_right: function(space) {
		space.functions.rotate_file90(space,space.fields.file_id,1);
		return JSON.stringify({refresh:1});
	},
/*****************************************************************************/
	admin_filebrowser__rotate_left: function(space) {
		space.functions.rotate_file90(space,space.fields.file_id,-1);
		return JSON.stringify({refresh:1});
	}
/*****************************************************************************/

};
